home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Hyper / S-Sh / SearchreplaceXCMD1.5.1.cpt / SearchReplace XCMD v.1.5.1 / card_6095.txt < prev    next >
Text File  |  1989-07-02  |  10KB  |  416 lines

  1. -- card: 6095 from stack: in.1
  2. -- bmap block id: 6336
  3. -- flags: 0000
  4. -- background id: 2639
  5. -- name: 
  6.  
  7.  
  8. -- part 1 (field)
  9. -- low flags: 01
  10. -- high flags: 0007
  11. -- rect: left=34 top=126 right=314 bottom=473
  12. -- title width / last selected line: 0
  13. -- icon id / first selected line: 0 / 0
  14. -- text alignment: 0
  15. -- font id: 3
  16. -- text size: 9
  17. -- style flags: 0
  18. -- line height: 12
  19. -- part name: source code listing
  20.  
  21.  
  22. -- part 2 (button)
  23. -- low flags: 00
  24. -- high flags: A002
  25. -- rect: left=34 top=313 right=333 bottom=154
  26. -- title width / last selected line: 0
  27. -- icon id / first selected line: 0 / 0
  28. -- text alignment: 1
  29. -- font id: 0
  30. -- text size: 12
  31. -- style flags: 0
  32. -- line height: 16
  33. -- part name: Copy Source Code
  34.  
  35.  
  36. -- part contents for background part 7
  37. ----- text -----
  38. For those of you interested, here is the source code listing for the SearchReplace XCMD done in Think Pascal‚Ñ¢. It was compiled and linked with the DRVRRuntime library. Then it was built and saved as a resource of type XCMD and pasted via ResEdit into this stack. The modeless dialog was built in ResEdit.
  39.  
  40.  
  41. -- part contents for card part 1
  42. ----- text -----
  43. unit SearchandReplaceXCMD;
  44. interface
  45.  type
  46.   XCmdPtr = ^XCmdBlock;
  47.   XCmdBlock = record
  48.     paramCount: INTEGER;
  49.     params: array[1..16] of Handle;
  50.     returnValue: Handle;
  51.     passFlag: BOOLEAN;
  52.  
  53.     entryPoint: ProcPtr;
  54.     request: INTEGER;
  55.     result: INTEGER;
  56.     inArgs: array[1..8] of LongInt;
  57.     outArgs: array[1..4] of LongInt;
  58.    end;
  59.  
  60.  procedure main (paramPtr: XCmdPtr);
  61.  
  62. implementation
  63.  procedure SearchReplace (paramPtr: XCmdPtr);
  64.  forward;
  65.  
  66.  procedure main;
  67.  begin
  68.   SearchReplace(paramPtr);
  69.  end;
  70.  
  71.  procedure SearchReplace;
  72.   const
  73.    xreqSendCardMessage = 1;
  74.    xreqEvalExpr = 2;
  75.    xreqZeroToPas = 8;
  76.    off = 0;
  77.    on = 1;
  78.    dimBtn = 255;
  79.    noDimBtn = 0;
  80.    SValue = 0;
  81.    SHilite = 1;
  82.    SFrame = 2;
  83.    EditSearchitem = 3;
  84.    EditReplaceItem = 4;
  85.    FindStringItem = 5;
  86.    FindWholeItem = 6;
  87.    FindNextBtnItem = 7;
  88.    ReplaceBtnItem = 8;
  89.    ReplaceAllBtnItem = 9;
  90.    theDlg = 14987;
  91.   var
  92.    thePart: integer;
  93.    searchString, replaceString, theMessage, theString: str255;
  94.    done, EventOccurred, searchType, BtnUpdate: boolean;
  95.    thePoint: point;
  96.    textCursor: curshandle;
  97.    oldPort: grafptr;
  98.    whichWindow: WindowPtr;
  99.    myEvent: EventRecord;
  100.    SearchReplaceDlg: dialogPtr;
  101.  
  102.   procedure DoJsr (addr: ProcPtr);
  103.   inline
  104.    $205F, $4E90;
  105.  
  106.   procedure ZeroToPas (zeroStr: Ptr; var pasStr: Str255);
  107.   begin
  108.    with paramPtr^ do
  109.     begin
  110.      inArgs[1] := ORD(zeroStr);
  111.      inArgs[2] := ORD(@pasStr);
  112.      request := xreqZeroToPas;
  113.      DoJsr(entryPoint);
  114.     end;
  115.   end;
  116.  
  117.   function EvalExpr (expr: Str255): Handle;
  118.   begin
  119.    with paramPtr^ do
  120.     begin
  121.      inArgs[1] := ORD(@expr);
  122.      request := xreqEvalExpr;
  123.      DoJsr(entryPoint);
  124.      EvalExpr := Handle(outArgs[1]);
  125.     end;
  126.   end;
  127.  
  128.   procedure SendCardMessage (msg: Str255);
  129.   begin
  130.    with paramPtr^ do
  131.     begin
  132.      inArgs[1] := ORD(@msg);
  133.      request := xreqSendCardMessage;
  134.      DoJsr(entryPoint);
  135.     end;
  136.   end;
  137.  
  138.   procedure AdjustThisItem (theItem: integer; btnFunction, state: integer);
  139.    var
  140.     itemtype: integer;
  141.     itemhandle: handle;
  142.     dispRect: rect;
  143.     crtlhandle: controlHandle;
  144.    procedure DoBtnFrame;
  145.     var
  146.      oldPenState: PenState;
  147.    begin
  148.     GetPenState(oldPenState);
  149.     InsetRect(dispRect, -4, -4);
  150.     PenSize(3, 3);
  151.     FrameRoundRect(dispRect, 16, 16);
  152.     SetPenState(oldPenState);
  153.    end;
  154.   begin
  155.    GetDItem(SearchReplaceDlg, theItem, itemType, itemHandle, dispRect);
  156.    crtlHandle := controlhandle(itemhandle);
  157.    case btnFunction of
  158.     SHilite: 
  159.      HiliteControl(crtlhandle, state);
  160.     SValue: 
  161.      SetCtlValue(crtlhandle, state);
  162.     SFrame: 
  163.      DoBtnFrame;
  164.    end;
  165.   end;
  166.  
  167.   procedure FBtnUpdate;
  168.   begin
  169.    if theString = '' then
  170.     begin
  171.      AdjustThisItem(FindNextBtnItem, SHilite, dimBtn);
  172.      AdjustThisItem(ReplaceBtnItem, SHilite, dimBtn);
  173.      AdjustThisItem(ReplaceAllBtnItem, SHilite, dimBtn);
  174.     end
  175.    else
  176.     AdjustThisItem(ReplaceBtnItem, SHilite, nodimBtn);
  177.   end;
  178.  
  179.   procedure DoFind;
  180.    var
  181.     searchMethod, quotedFindString: str255;
  182.     theHandle: handle;
  183.   begin
  184.    if searchType then
  185.     searchMethod := 'string '
  186.    else
  187.     searchMethod := 'whole ';
  188.    quotedFindString := concat('"', searchString, '"');
  189.    theMessage := concat('find ', searchMethod, quotedFindString);
  190.    SendCardMessage(theMessage);
  191.    theHandle := EvalExpr('the foundChunk');
  192.    ZeroToPas(theHandle^, theString);
  193.    setPort(SearchReplaceDlg);
  194.    if BtnUpdate then
  195.     FBtnUpdate;
  196.   end;
  197.  
  198.   procedure DoReplace;
  199.    var
  200.     quotedReplaceString: str255;
  201.    procedure RBtnUpdate;
  202.    begin
  203.     AdjustThisItem(ReplaceBtnItem, SHilite, dimBtn);
  204.    end;
  205.   begin
  206.    if theString <> '' then
  207.     begin
  208.      SendCardMessage('put the foundchunk into markedText');
  209.      quotedReplaceString := concat('"', replaceString, '"');
  210.      theMessage := concat(' put "put "  & quote &', quotedReplaceString, '& quote & " into "  & markedText into replaceAction ');
  211.      SendCardMessage(theMessage);
  212.      SendCardMessage('send replaceAction');
  213.      setPort(SearchReplaceDlg);
  214.      if BtnUpdate then
  215.      RBtnUpdate;
  216.     end;
  217.   end;
  218.  
  219.   procedure DoReplaceAll;
  220.   begin
  221.    BtnUpdate := false;
  222.    repeat
  223.     begin
  224.      DoFind;
  225.      DoReplace;
  226.     end;
  227.    until theString = '';
  228.    FBtnUpdate;
  229.    BtnUpdate := true;
  230.   end;
  231.  
  232.   procedure DotheDialog (myEvent: EventRecord);
  233.    var
  234.     DialogHit: boolean;
  235.     whichDialog: DialogPtr;
  236.     theItem, itemType: integer;
  237.     dispRect: rect;
  238.     itemhandle: handle;
  239.    procedure KeyDownEvent;
  240.     const
  241.      ReturnKey = 13;
  242.      EnterKey = 3;
  243.     var
  244.      chCode: integer;
  245.     procedure FlushPendingEvent;
  246.     begin
  247.      FlushEvents(everyEvent, 0);
  248.      EventOccurred := GetNextEvent(everyEvent, myEvent);
  249.     end;
  250.    begin
  251.     with myEvent do
  252.      begin
  253.      chCode := BitAnd(message, CharCodeMask);
  254.      if (chCode = ReturnKey) or (chCode = EnterKey) then
  255.      begin
  256.      if what = autokey then
  257.      while what = autoKey do
  258.      begin
  259.      DoFind;
  260.      EventOccurred := GetNextEvent(everyEvent, myEvent);
  261.      end
  262.      else
  263.      DoFind;
  264.      FlushPendingEvent;
  265.      end;
  266.      end;
  267.    end;
  268.    procedure CheckTheItems;
  269.    begin
  270.     case theItem of
  271.      EditSearchitem: 
  272.      begin
  273.      GetDItem(whichDialog, EditSearchitem, itemtype, itemhandle, dispRect);
  274.      GetIText(itemhandle, searchString);
  275.      if searchString <> '' then
  276.      begin
  277.      AdjustThisItem(FindNextBtnItem, SHilite, nodimBtn);
  278.      AdjustThisItem(ReplaceBtnItem, SHilite, nodimBtn);
  279.      AdjustThisItem(ReplaceAllBtnItem, SHilite, nodimBtn);
  280.      end
  281.      else
  282.      begin
  283.      AdjustThisItem(FindNextBtnItem, SHilite, dimBtn);
  284.      AdjustThisItem(ReplaceBtnItem, SHilite, dimBtn);
  285.      AdjustThisItem(ReplaceAllBtnItem, SHilite, dimBtn);
  286.      end;
  287.      end;
  288.      EditReplaceItem: 
  289.      begin
  290.      GetDItem(SearchReplaceDlg, EditReplaceItem, itemtype, itemhandle, dispRect);
  291.      GetIText(itemhandle, replaceString);
  292.      end;
  293.      FindStringItem: 
  294.      begin
  295.      searchType := true;
  296.      AdjustThisItem(FindStringItem, SValue, on);
  297.      AdjustThisItem(FindWholeItem, SValue, off);
  298.      end;
  299.      FindWholeItem: 
  300.      begin
  301.      searchType := false;
  302.      AdjustThisItem(FindStringItem, SValue, off);
  303.      AdjustThisItem(FindWholeItem, SValue, on);
  304.      end;
  305.      FindNextBtnItem: 
  306.      DoFind;
  307.      ReplaceBtnItem: 
  308.      DoReplace;
  309.      ReplaceAllBtnItem: 
  310.      DoReplaceAll;
  311.      otherwise
  312.     end;
  313.    end;
  314.   begin
  315.    if (myEvent.what = keyDown) or (myEvent.what = autoKey) then
  316.     KeyDownEvent;
  317.    if DialogSelect(myEvent, whichDialog, theItem) then
  318.     CheckTheItems
  319.    else if myEvent.what = UpdateEvt then
  320.     AdjustThisItem(FindNextBtnItem, SFrame, on);
  321.   end;
  322.  
  323.   procedure SetUpDialog;
  324.    var
  325.     itemtype: integer;
  326.     itemhandle: handle;
  327.     dispRect: rect;
  328.    procedure InitialBtnSettings;
  329.    begin
  330.     done := false;
  331.     textCursor := GetCursor(IBeamCursor);
  332.     searchType := true;
  333.     BtnUpdate := true;
  334.     theString := '';
  335.     replaceString := '';
  336.     AdjustThisItem(FindStringItem, SValue, on);
  337.     AdjustThisItem(FindWholeItem, SValue, off);
  338.     AdjustThisItem(FindNextBtnItem, SHilite, dimBtn);
  339.     AdjustThisItem(ReplaceBtnItem, SHilite, dimBtn);
  340.     AdjustThisItem(ReplaceAllBtnItem, SHilite, dimBtn);
  341.    end;
  342.   begin
  343.    getPort(oldPort);
  344.    SearchReplaceDlg := GetNewDialog(theDlg, nil, pointer(-1));
  345.    ShowWindow(SearchReplaceDlg);
  346.    setPort(SearchReplaceDlg);
  347.    InitialBtnSettings;
  348.    DrawDialog(SearchReplaceDlg);
  349.   end;
  350.  
  351.   procedure MouseDownEvent;
  352.    var
  353.     dragBnds: rect;
  354.   begin
  355.    thePart := FindWindow(myEvent.where, whichWindow);
  356.    case thePart of
  357.     inGoAway: 
  358.      if whichWindow = SearchReplaceDlg then
  359.      done := TrackGoAway(whichWindow, myEvent.where);
  360.     inDrag: 
  361.      begin
  362.      if whichWindow = SearchReplaceDlg then
  363.      begin
  364.      setRect(dragBnds, 4, 24, 508, 338);
  365.      DragWindow(whichWindow, myEvent.where, dragBnds);
  366.      SendCardMessage('go this card ');
  367.      end;
  368.      end;
  369.     otherwise
  370.    end;
  371.   end;
  372.  
  373.   procedure AdjustCursor;
  374.    var
  375.     searchRect, replaceRect: rect;
  376.     itemType: integer;
  377.     itemHandle: handle;
  378.   begin
  379.    setPort(SearchReplaceDlg);
  380.    GetMouse(thePoint);
  381.    GetDItem(SearchReplaceDlg, EditSearchitem, itemtype, itemhandle, searchRect);
  382.    GetDItem(SearchReplaceDlg, EditReplaceItem, itemtype, itemhandle, replaceRect);
  383.    if PtInRect(thePoint, searchRect) or PtInRect(thePoint, replaceRect) then
  384.     setCursor(textCursor^^)
  385.    else
  386.     InitCursor;
  387.   end;
  388.  
  389.   procedure Goodbye;
  390.   begin
  391.    setPort(oldPort);
  392.    DisposDialog(SearchReplaceDlg);
  393.    FlushEvents(everyEvent, 0);
  394.   end;
  395.  
  396.  begin
  397.   SetUpDialog;
  398.   repeat
  399.    begin
  400.     AdjustCursor;
  401.     SystemTask;
  402.     EventOccurred := GetNextEvent(everyEvent, myEvent);
  403.     if IsDialogEvent(myEvent) then
  404.      DoTheDialog(myEvent)
  405.     else if EventOccurred then
  406.      case myEvent.what of
  407.      mouseDown: 
  408.      MouseDownEvent;
  409.      otherwise
  410.      end;
  411.    end;
  412.   until done;
  413.   Goodbye;
  414.  end;
  415. end.
  416.